/**   
* @Title: CrunchifyImpl.java 
* @Package: com.ifuntimes.http
* @Description: TODO
* @author:YuHai
* @Email: it@ifuntimes.com  
* @date 2017年09月05日 上午11:18:40 
* @version V1.0   
*/
package com.ifuntimes.http;

import java.util.Arrays;
import java.util.List;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.ifuntimes.drapi.autosdk.cloud.service.AccountInfo;
import com.ifuntimes.drapi.autosdk.cloud.service.AccountService;
import com.ifuntimes.drapi.autosdk.cloud.service.AdgroupService;
import com.ifuntimes.drapi.autosdk.cloud.service.AdgroupType;
import com.ifuntimes.drapi.autosdk.cloud.service.CampaignService;
import com.ifuntimes.drapi.autosdk.cloud.service.CampaignType;
import com.ifuntimes.drapi.autosdk.cloud.service.GetAccountInfoRequest;
import com.ifuntimes.drapi.autosdk.cloud.service.GetAccountInfoResponse;
import com.ifuntimes.drapi.autosdk.cloud.service.GetAdgroupRequest;
import com.ifuntimes.drapi.autosdk.cloud.service.GetAdgroupResponse;
import com.ifuntimes.drapi.autosdk.cloud.service.GetCampaignRequest;
import com.ifuntimes.drapi.autosdk.cloud.service.GetCampaignResponse;
import com.ifuntimes.drapi.autosdk.cloud.service.GetWordRequest;
import com.ifuntimes.drapi.autosdk.cloud.service.GetWordResponse;
import com.ifuntimes.drapi.autosdk.cloud.service.KeywordService;
import com.ifuntimes.drapi.autosdk.cloud.service.KeywordType;
import com.ifuntimes.drapi.autosdk.cloud.service.UpdateAccountInfoRequest;
import com.ifuntimes.drapi.autosdk.cloud.service.UpdateAccountInfoResponse;
import com.ifuntimes.drapi.autosdk.core.CommonService;
import com.ifuntimes.drapi.autosdk.core.ResHeader;
import com.ifuntimes.drapi.autosdk.core.ResHeaderUtil;
import com.ifuntimes.drapi.autosdk.core.ServiceFactory;
import com.ifuntimes.drapi.autosdk.exception.ApiException;
import com.ifuntimes.http.entity.AdgroupTypeEntity;
import com.ifuntimes.http.entity.CampaignTypeEntity;
import com.ifuntimes.http.entity.KeywordTypeEntity;

/**
 * @ClassName: CrunchifyImpl
 * @Description: TODO
 * @author YuHai if@ifuntimes.com
 * @date 2017年09月05日 上午11:18:40
 * 
 */
public class CrunchifyImpl implements Crunchify {

	private static final int OK = 0;
	private static final int SERVER_ERROR = 500;

	private static CommonService factory;
	private static AccountService accountService;
	private static CampaignService campaignService;
	private static AdgroupService adgroupService;
	private static KeywordService keywordService;
	private static String SUCCESS = "success";
	private static String[] accountFields = { "userId" };

	public CrunchifyImpl() {

	}

	private AccountInfo getAccountInfo() throws ApiException {
		GetAccountInfoRequest request = new GetAccountInfoRequest();
		request.setAccountFields(Arrays.asList(accountFields));
		GetAccountInfoResponse response = accountService.getAccountInfo(request);
		ResHeader rheader = ResHeaderUtil.getResHeader(accountService, true);
		if (SUCCESS.equals(rheader.getDesc()) && rheader.getStatus() == 0) {
			List<AccountInfo> data = response.getData();
			return data.get(0);
		}
		//Assert.assertTrue(SUCCESS.equals(resHeader.getDesc()) && resHeader.getStatus() == 0);
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ifuntimes.http.Crunchify#hMsg(java.lang.String)
	 */
	@Override
	public ReturnMsg getAccountInfo(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		if (factory == null) {
			factory = ServiceFactory.getInstance(opUsername, opPassword, tgUsername, tgPassword, tgSubname);
		}
		if (accountService == null) {
			accountService = factory.getService(AccountService.class);
		}
		GetAccountInfoRequest request = new GetAccountInfoRequest();
		List<String> fields = JSONArray.parseArray(data, String.class);

		request.setAccountFields(fields);

		GetAccountInfoResponse response = accountService.getAccountInfo(request);
		ResHeader rheader = ResHeaderUtil.getResHeader(accountService, true);
		if (SUCCESS.equals(rheader.getDesc()) && rheader.getStatus() == 0) {
			List<AccountInfo> datas = response.getData();
			System.out.println(JSON.toJSON(datas.get(0)));
			return new ReturnMsg(OK, "", JSON.toJSON(datas.get(0)));
		}
		return new ReturnMsg(SERVER_ERROR, "", "ERROR");
	}

	/**
	 * @Title AccountService
	 * @Description 更新username对应的账户信息，如果是来自MCC Token的请求，则更新target对应的账户信息。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg updateAccountInfo(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		if (factory == null) {
			factory = ServiceFactory.getInstance(opUsername, opPassword, tgUsername, tgPassword, tgSubname);
		}
		if (accountService == null) {
			accountService = factory.getService(AccountService.class);
		}
		
		AccountInfo fields = JSONArray.parseObject(data, AccountInfo.class);
		AccountInfo accountInfo = this.getAccountInfo();
		if(accountInfo==null){
			return new ReturnMsg(SERVER_ERROR, "", "ACCOUNT INO IS NULL");
		}
		if (fields.getBudgetType() != null) {
			accountInfo.setBudgetType(fields.getBudgetType());
		}
		if (fields.getBudget() != null) {
			accountInfo.setBudget(fields.getBudget());
		}

		if (fields.getExcludeIp() != null) {
			accountInfo.setExcludeIp(fields.getExcludeIp());
		}
		if (fields.getIsDynamicCreative() != null) {
			accountInfo.setIsDynamicCreative(fields.getIsDynamicCreative());
		}
		if (fields.getIsDynamicTitle() != null) {
			accountInfo.setIsDynamicTitle(fields.getIsDynamicTitle());
		}

		if (fields.getIsDynamicHotRedirect() != null) {
			accountInfo.setIsDynamicHotRedirect(fields.getIsDynamicHotRedirect());
		}
		UpdateAccountInfoRequest request = new UpdateAccountInfoRequest();
		request.setAccountInfo(accountInfo);
		UpdateAccountInfoResponse response = accountService.updateAccountInfo(request);
		ResHeader resHeader = ResHeaderUtil.getResHeader(accountService, true);
		if (SUCCESS.equals(resHeader.getDesc()) && resHeader.getStatus() == 0) {
			List<AccountInfo> datas = response.getData();
			System.out.println(JSON.toJSON(datas.get(0)));
			return new ReturnMsg(OK, "", JSON.toJSON(datas.get(0)));
		}
		return new ReturnMsg(SERVER_ERROR, "", "ERROR");
	}
	
	 

	/**
	 * @Title CampaignService
	 * @Description 根据指定的计划id获取推广计划(id可批量) 。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg getCampaign(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {

		if (factory == null) {
			factory = ServiceFactory.getInstance(opUsername, opPassword, tgUsername, tgPassword, tgSubname);
		}
		if (campaignService == null) {
			campaignService = factory.getService(CampaignService.class);
		}
		
		CampaignTypeEntity fields = JSONArray.parseObject(data, CampaignTypeEntity.class);
		GetCampaignRequest request = new GetCampaignRequest();
		request.setCampaignFields(fields.getCampaignFields());
		if(fields.getCampaignId().isEmpty()){
			request.setCampaignIds(null);
		}else {
			request.setCampaignIds(fields.getCampaignId());
		}
		request.setMobileExtend(fields.getMobileExtend());	
		GetCampaignResponse response = campaignService.getCampaign(request);
		ResHeader rheader = ResHeaderUtil.getResHeader(campaignService, true);
		if (SUCCESS.equals(rheader.getDesc()) && rheader.getStatus() == 0) {
			List<CampaignType> datas = response.getData();
			String jsonDatas= JSON.toJSONString(datas);
			System.out.println(jsonDatas);
			return new ReturnMsg(OK, "", jsonDatas);
		}		
		return new ReturnMsg(SERVER_ERROR, "", "ERROR");
	}

	/**
	 * @Title CampaignService
	 * @Description 新增推广计划，新增时可设置计划的属性设置（包含无线推广的属性设置）。
	 *              支持一次新增多个计划，每个账户下最多支持100个计划。 无效属性不返回，没有输入值的属性不返回。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg addCampaign(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title CampaignService
	 * @Description 根据指定的计划ID更新推广计划的属性 支持批量更新推广计划的属性，每账户最多100个计划。 不更新的属性，无返回值
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg updateCampaign(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title CampaignService
	 * @Description 删除指定的计划(可批量)
	 * @param parmas
	 * @return
	 */
	public ReturnMsg deleteCampaign(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title AdgroupService
	 * @Description 根据指定的单元id获取推广单元。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg getAdgroup(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		if (factory == null) {
			factory = ServiceFactory.getInstance(opUsername, opPassword, tgUsername, tgPassword, tgSubname);
		}
		if (adgroupService == null) {
			adgroupService = factory.getService(AdgroupService.class);
		}
		GetAdgroupRequest request = new GetAdgroupRequest();
		AdgroupTypeEntity fields = JSONArray.parseObject(data, AdgroupTypeEntity.class);
		request.setAdgroupFields(fields.getAdgroupFields());
        request.setIds(fields.getIds());
        request.setIdType(fields.getIdType());
        GetAdgroupResponse response = adgroupService.getAdgroup(request);
        ResHeader rheader = ResHeaderUtil.getResHeader(adgroupService, true);       
        if (SUCCESS.equals(rheader.getDesc()) && rheader.getStatus() == 0) {
        	 List<AdgroupType> datas = response.getData();
			String jsonDatas= JSON.toJSONString(datas);
			System.out.println(jsonDatas);
			return new ReturnMsg(OK, "", jsonDatas);
		}		
		return new ReturnMsg(SERVER_ERROR, "", "ERROR");		
	}

	/**
	 * @Title AdgroupService
	 * @Description 新增推广单元(可批量)。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg addAdgroup(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title AdgroupService
	 * @Description 更新推广单元(可批量)。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg updateAdgroup(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title AdgroupService
	 * @Description 删除指定的单元(可批量)
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg deleteAdgroup(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KeywordService
	 * @Description 根据指定的单元id、关键词id获取关键词信息。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg getWord(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		if (factory == null) {
			factory = ServiceFactory.getInstance(opUsername, opPassword, tgUsername, tgPassword, tgSubname);
		}
		if (keywordService == null) {
			keywordService = factory.getService(KeywordService.class);
		}
		GetWordRequest request = new GetWordRequest();
		KeywordTypeEntity fields = JSONArray.parseObject(data, KeywordTypeEntity.class);
		
        request.setIds(fields.getIds());
        request.setIdType(fields.getIdType());
        request.setGetTemp(fields.getGetTemp());
        request.setWordFields(fields.getWordFields());
        
        GetWordResponse response = keywordService.getWord(request);
        ResHeader rheader = ResHeaderUtil.getResHeader(adgroupService, true);       
        if (SUCCESS.equals(rheader.getDesc()) && rheader.getStatus() == 0) {
        	List<KeywordType> datas = response.getData();
			String jsonDatas= JSON.toJSONString(datas);
			System.out.println(jsonDatas);
			return new ReturnMsg(OK, "", jsonDatas);
		}		
		return new ReturnMsg(SERVER_ERROR, "", "ERROR");
	}

	/**
	 * @Title KeywordService
	 * @Description 新增关键词（可批量）。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg addWord(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KeywordService
	 * @Description 更新关键词（可批量）。
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg updateWord(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KeywordService
	 * @Description 删除指定的关键词（可批量）
	 * @param parmas
	 * @return
	 */
	@Override
	public ReturnMsg deleteWord(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title CreativeService
	 * @Description 根据指定的单元id、创意id获取创意信息。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title CreativeService
	 * @Description 新增创意（可批量）。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg addCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title CreativeService
	 * @Description 更新创意（可批量）。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg updateCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title CreativeService
	 * @Description 删除指定的创意(可批量) 。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg deleteCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 根据指定的id类型和id信息，获取推广子链。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getSublink(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 新增计算机推广子链，可批量添加。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg addSublink(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 更新计算机推广子链，可批量更新。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg updateSublink(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 删除指定的附加创意。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg deleteSublinkRequest(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 根据指定的单元ID或电话ID获取电话信息。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getPhone(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 新增电话对象数组；不超过5000
	 * @param parmas
	 * @return
	 */
	public ReturnMsg addPhone(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 更新网页回呼对象数组，不超过5000
	 * @param parmas
	 * @return
	 */
	public ReturnMsg updateEcall(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title NewCreativeService
	 * @Description 网页回呼分组数组
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getEcallGroup(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title DynamicCreativeService
	 * @Description 批量不超过10000，建议分批多次请求。 添加动态创意描述，可在附属于计划层级、单元层级。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg addDynCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title DynamicCreativeService
	 * @Description 批量不超过10000，建议分批多次请求。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg deleteDynCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title DynamicCreativeService
	 * @Description 批量不超过10000，建议分批多次请求。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg updateDynCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title DynamicCreativeService
	 * @Description 带查询属性集合
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getDynCreative(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title DynamicCreativeService
	 * @Description 根据指定推广计划id获取推广计划下所有排除对象（id可批量）。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getExclusionTypeByCampaignId(String opUsername, String opPassword, String tgUsername,
			String tgPassword, String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title DynamicCreativeService
	 * @Description 添加动态创意排除对象，支持批量，每个计划最多绑定排除URL20个，
	 *              绑定排除词50个，每次最多操作100个计划。（重复的排除对象不会被添加。添加以计划为单位，
	 *              每个计划下排除对象要么全添加成功，要么全添加失败。）
	 * @param parmas
	 * @return
	 */
	public ReturnMsg addExclusionType(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title DynamicCreativeService
	 * @Description 按计划id及动态创意排除对象id删除动态创意排除对象。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg delExclusionType(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title ReportService
	 * @Description 实时报告-包含多类报告。
	 *              请求账户，计划，单元，关键词keywordid，关键词wordid，创意，地域等7种绩效数据报告，
	 *              请求时提供所需数据报告的条件，返回本次请求数据。 从属service: ReportService
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getRealTimeData(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title ReportService
	 * @Description 搜索词报告 请求搜索词报告的绩效数据报告，请求时提供所需数据报告的条件，返回本次请求数据 从属service:
	 *              ReportService
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getRealTimeQueryData(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title ReportService
	 * @Description 异步报告请求绩效数据报告， 请求时提供所需数据报告的条件，返回本次请求的reportId。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getProfessionalReportId(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title ReportService
	 * @Description 异步报告请求绩效数据报告， 查询报告当前的生成状态。请求中提供报告ID，返回中带有当前报告ID的处理状态。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getReportState(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title ReportService
	 * @Description 异步报告请求绩效数据报告， 获取报告下载地址。当报告成功生成后，使用reportId请求，返回相应的报告下载地址。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getReportFileUrl(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title BulkJobService 使用此服务可以将对您的大批量请求安排为异步批量请求， 并可以获取您近期所执行请求的状态、结果等信息。
	 * @Description 获取指定账户下的完整数据（计划、单元、关键词、创意、蹊径、无线蹊径、电话、商桥、动态创意），
	 *              或者获取指定计划下的完整数据（计划、单元、关键词、创意、蹊径、无线蹊径、电话、商桥、动态创意）。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getAllObjects(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title BulkJobService 使用此服务可以将对您的大批量请求安排为异步批量请求， 并可以获取您近期所执行请求的状态、结果等信息。
	 * @Description 通过该接口获取完整账户下，或者指定计划ID下的有变化的物料信息。 该接口为异步接口，返回请求的结果文件ID。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getAllChangedObjects(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title BulkJobService 使用此服务可以将对您的大批量请求安排为异步批量请求， 并可以获取您近期所执行请求的状态、结果等信息。
	 * @Description 在调用getAllObejects、getAllChangedObjects接口后使用，以查询请求的文件是否已生成。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getFileStatus(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title BulkJobService 使用此服务可以将对您的大批量请求安排为异步批量请求， 并可以获取您近期所执行请求的状态、结果等信息。
	 * @Description 返回请求的文件下载地址。使用接口：getAllObjects，getAllChangedObjects按照请求的下载文件顺序返回。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getFilePath(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title BulkJobService 使用此服务可以将对您的大批量请求安排为异步批量请求， 并可以获取您近期所执行请求的状态、结果等信息。
	 * @Description 取消一个下载任务。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg cancelDownload(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title BulkJobService 使用此服务可以将对您的大批量请求安排为异步批量请求， 并可以获取您近期所执行请求的状态、结果等信息。
	 * @Description 获取从指定时间到当前时间段内有变化的物料id。各层级除计划层级返回的数据限制不超过两万条。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getChangedItemId(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title BulkJobService 使用此服务可以将对您的大批量请求安排为异步批量请求， 并可以获取您近期所执行请求的状态、结果等信息。
	 * @Description 获取完整账户下，或者指定计划ID下的变化物料规模，从而帮助用户决定后续的最近更新策略。当有变化的物料规模大于一定比例时，用户不妨选择整账户下载。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getChangedScale(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title ToolKitService 历史操作记录查询。
	 * @Description 请求账户，计划，单元，关键词等层级的历史操作记录，请求时提供所查询条件，返回本次请求数据
	 *              如果是新增操作，操作前值为“-”，同理，如果是删除操作，操作后值为“-“； 从属service:
	 *              ToolkitService
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getOperationRecord(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KRService 关键词规划师。
	 * @Description 账户主动推词接口：根据用户的账户和业务内容，返回对应的为用户量身定制的推荐词。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getKRCustom(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KRService 关键词规划师。
	 * @Description 根据输入的种子词或url返回推荐的扩展词，一次调用仅允许请求1个种子词或一个url。。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getKRByQuery(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KRService 关键词规划师。
	 * @Description 关键词预估接口。根据出价获取关键词预估结果。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getEstimatedDataByBid(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KRService 关键词规划师。
	 * @Description 关键词预估接口。随机出价获取关键词预估结果。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getEstimatedData(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KRService 关键词规划师。
	 * @Description 异步接口，根据输入的种子词返回推荐的扩展词，一次调用允许请求100个种子词。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getKRFileIdByWords(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KRService 关键词规划师。
	 * @Description 在调用getKRFileIdByWords接口后使用，以查询请求的文件是否已生成。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getKRFileStatus(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title KRService 关键词规划师。
	 * @Description 返回请求的文件下载地址。使用接口：getKRFileIdByWords。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getKRFilePath(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title SearchService 物料搜索。
	 * @Description 用户提供一个待搜索的关键词，搜索层级及搜索范围信息，服务端返回用户当前账户中的相关关键词的搜索结果。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getMaterialInfoBySearch(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title SearchService 物料搜索。
	 * @Description 用户提供一个待搜索的id序列，服务端返回用户此id序列下对应状态的的单元/关键词数量，id数量不超过1000。
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getCountById(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/**
	 * @Title SearchService 物料搜索。
	 * @Description
	 * @param parmas
	 * @return
	 */
	public ReturnMsg getTab(String opUsername, String opPassword, String tgUsername, String tgPassword,
			String tgSubname, String data) throws ApiException {
		return null;
	}

	/*
	 * (非 Javadoc) <p>Title: serverError</p> <p>Description: </p>
	 * 
	 * @param parmas
	 * 
	 * @return
	 * 
	 * @see com.ifuntimes.http.Crunchify#serverError(java.lang.String)
	 */
	@Override
	public ReturnMsg serverError(Object e) {
		Object[] args = new Object[] { e };
		return new ReturnMsg(SERVER_ERROR, "Server Error", args);
	}

}
